// 初始化 axios实例
import axios from 'axios'
import config from './config'
import router from '../router'

// 对外暴露出请求方法
export default function request(options) {
  return new Promise((resolve, reject) => {
    // 声明一个实例化的axios对象并赋给 instance 变量
    const instance = axios.create({
      ...config
    })

    // 请求拦截器
    instance.interceptors.request.use(
      (config) => {
        // 1. 取token
        let token = localStorage.getItem('pm_token')
        // 2. 判断token的逻辑，有，添加到header，没有，去到登录页
        if (token) {
          config.headers.token = token
        } else {
          router.push('/login')
        }
        // 3. return config
        return config
      },
      (error) => {
        console.log('request error', error)
        // 判断请求超时
        if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
          ElMessage({
            message: '请求超时',
            type: 'error',
            showClose: true
          })
        }
      }
    )

    // 响应拦截器
    instance.interceptors.response.use(
      (response) => {
        return response.data
      },
      (err) => {
        if (err && err.response) {
          switch (err.response.status) {
            case 400:
              err.message = '请求错误'
              break
            case 401:
              err.message = '未授权，请登录'
              break
            case 403:
              err.message = '拒绝访问'
              break
            case 404:
              err.message = `请求地址出错: ${err.response.config.url}`
              break
            case 408:
              err.message = '请求超时'
              break
            case 500:
              err.message = '服务器内部错误'
              break
            case 501:
              err.message = '服务未实现'
              break
            case 502:
              err.message = '网关错误'
              break
            case 503:
              err.message = '服务不可用'
              break
            case 504:
              err.message = '网关超时'
              break
            case 505:
              err.message = 'HTTP版本不受支持'
              break
            // ...
            default:
              break
          }
        }

        console.error(err)

        if (err.message) {
          ElMessage({
            message: err.message,
            type: 'error',
            showClose: true
          })
        }

        return Promise.reject(err)
      }
    )

    // 处理正确逻辑
    instance(options)
      .then((res) => {
        if (res.code === 200) {
          resolve(res)
        } else {
          // 未登录
          if (res.code === -2) {
            router.push('/login')
          }
          ElMessage({
            message: res.msg || '操作失败',
            type: 'error',
            showClose: true
          })
          reject(res)
        }
      })
      .catch((error) => {
        reject(error)
      })
  })
}
